#include<stdio.h>
#include<unistd.h>
#include<sys/bitypes.h>
#include<sys/wait.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>

void func()
{
    exit(255);
}

int main()
{
    func();
    sleep(1);
    return 0;
}
 
//#include<stdio.h>
 //#include<unistd.h>
 //#include<sys/bitypes.h>
 //#include<sys/wait.h>
 //#include<string.h>
 //#include<errno.h>
 //#include<stdlib.h>
 //
 //typedef void(*func_t)();
 //#define NUM 5
 //func_t handlers[NUM+1];
 //
 //void Download()
 //{
 //    printf("这是下载功能\n");
 //}
 //void Flush()
 //{
 //    printf("这是刷新功能\n");
 //}
 //void Log()
 //{
 //    printf("这是日志功能\n");
 //}
 //
 //// 注册
 //void registerhandlers(func_t h[],func_t f)
 //{                                                                                                                                                                   
 //    int i = 0;
 //    for(;i < NUM;i++)
 //    {
 //        if(h[i] == NULL) break;
 //    }
 //    if(i == NUM) return;
 //    h[i] = f;
 //    h[i+1] = NULL;
 //}
 //
 //int main()
 //{
 //    registerhandlers(handlers,Download);
 //    registerhandlers(handlers,Flush);
 //    registerhandlers(handlers,Log);
 //    pid_t id = fork();
 //    if(id == 0)
 //    {
 //        // child
 //        int cnt = 5;
 //        while(cnt--)                                                                                                                                                
 //        {
 //            printf("我是子进程，pid:%d,ppid:%d\n",getpid(),getppid());
 //            sleep(1);
 //            // int a = 10;
 //            // a /= 0;
 //        }
 //        exit(1);
 //    }
 //    // 父进程
 //    int status = 0;
 //    pid_t rid = waitpid(id,&status,WNOHANG);
 //    while(1)
 //    {
 //        if(rid > 0)
 //        {
 //            printf("wait success,rid:%d,exit code : %d,exit signal: %d\n",rid,WEXITSTATUS(status),(status & 0x7F));
 //            break;
 //        }
 //        else if(rid == 0)
 //        {
 //            int i = 0;
 //            for(;handlers[i];i++)
 //            {
 //                handlers[i]();
 //            }
 //            printf("waitpid调用结束，子进程未退出\n");
 //            sleep(1);
 //        }
 //        else 
 //        {
 //            printf("等待失败\n");
 //            break;
 //        }
 //    }
 //    return 0;
 //}

//typedef void(*func_t)();
//#define NUM 5
//func_t handlers[NUM+1];
//
//void Download()
//{
//    printf("这是下载功能\n");
//}
//void Flush()
//{
//    printf("这是刷新功能\n");
//}
//void Log()
//{
//    printf("这是日志功能\n");
//}
//
//// 注册
//void registerhandlers(func_t h[],func_t f)
//{
//    int i = 0;
//    for(;i < NUM;i++)
//    {
//        if(h[i] == NULL) break;
//    }
//    if(i == NUM) return;
//    h[i] = f;
//    h[i+1] = NULL;
//}
//
//int main()
//{
//    registerhandlers(handlers,Download);
//    registerhandlers(handlers,Flush);
//    registerhandlers(handlers,Log);
//    pid_t id = fork();
//    if(id == 0)
//    {
//        // child
//        int cnt = 5;
//        while(cnt--)
//        {
//            printf("我是子进程，pid:%d,ppid:%d\n",getpid(),getppid());
//            sleep(1);
//            // int a = 10;
//            // a /= 0;
//        }
//        exit(1);
//    }
//    // 父进程
//    int status = 0;
//    pid_t rid = waitpid(id,&status,WNOHANG);
//    while(1)
//    {
//        if(rid > 0)
//        {
//            printf("wait success,rid:%d,exit code : %d,exit signal: %d\n",rid,WEXITSTATUS(status),(status & 0x7F));
//            break;
//        }
//        else if(rid == 0)
//        {
//            int i = 0;
//            for(;handlers[i];i++)
//            {
//                handlers[i]();
//            }
//            printf("waitpid调用结束，子进程未退出\n");
//            sleep(1);
//        }
//        else 
//        {
//            printf("等待失败\n");
//            break;
//        }
//    }
//    return 0;
//}
//
//
////
////int main()
////{
////    pid_t id = fork();
//    if(id == 0)
//    {
//        // child
//        int cnt = 1;
//        while(cnt--)
//        {
//            printf("我是子进程，pid:%d,ppid:%d\n",getpid(),getppid());
//            sleep(1);
//            // int a = 10;
//            // a /= 0;
//        }
//        exit(1);
//    }
//    else 
//    {
//        //father
//        int status = 0;
//        pid_t rid = waitpid(id,&status,0);
//        if(rid > 0)
//        {
//            if(WIFEXITED(status))
//                printf("wait success,rid:%d,exit code : %d,exit signal: %d\n",rid,WEXITSTATUS(status),(status & 0x7F));
//                // printf("wait success,rid:%d,exit code : %d,exit signal: %d\n",rid,(status>>8) & 0xFF,(status & 0x7F));
//            else 
//                printf("子进程退出异常\n");
//        }
//        else 
//        {
//            printf("wait failed,exit code : %d,exit signal: %d\n",(status>>8) & 0xFF,(status & 0x7F));
//            // printf("wait failed,status: %d ,%d : %s\n ",status,errno,strerror(errno));
//        }
//    }
//    return 0;
//}
